<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Http\Requests\ResourceWrite;
use App\Models\File;
use App\Models\Resource;
use Auth;
use DB;
use Illuminate\Http\Request;
use stdClass;


class ResourceController extends Controller
{
    //
    public function index(Resource $resource,Request $request){

        // 这里要预加载的名称也是对应Resource模型中的反向一对多，将预加载的数据重新赋值给$resource
        $resource = $resource->with("adminUser");

        /**
         * search 搜索对象，创建stdClass基础对象，将请求获取到的内容存进来
         */
        $search = new stdClass;
        $search->keyword = $request->input('keyword','');
        $search->adminuser_id = $request->input('adminuser_id','');
        $search->type = $request->input('type',null);

        if($search->keyword){
            // like是模糊查询，前后加%是指只要当前关键字，出现在title这个字段里的任何位置，就匹配
            $resource = $resource->where('title','like',"%{$search->keyword}%");
        }

        if($search->adminuser_id){
            $resource = $resource->where('adminuser_id',$search->adminuser_id);
        }

        if($search->type){
            // wherein可以同时处理多个条件，也就是说传1或者传2都可以
            $resource = $resource->whereIn('type',$search->type);
        }

        $resource = $resource->orderBy('id','desc')->paginate(setting('page_resource'))->withQueryString();
        $data = [
            'resources'=>$resource,
            'search'=>$search
        ];
        return view('admin.resource.index',$data);
    }

    // 添加、编辑资源
    public function add(Request $request,Resource $resource){
        $type = $resource->id ? $resource->type : $request->input('type');
        if(!$type){
            alert('请指定资源类型','danger');
            return redirect()->route('admin.resource');
        }
        $data = [
            'type'=>$type,
            'resource'=>$resource
        ];
        return view('admin.resource.add',$data);
    }

    // 提交
    public function save(ResourceWrite $request,Resource $resource){
       $data = $request->all();
       $data['adminuser_id']=Auth::guard('admin')->id();

       DB::transaction(function ()use($resource,$data){
        // 根据资源类型，动态指定关联方法
        switch($data['type']){
            case Resource::VIDEO:
                $relation = 'video';
            break;
            case Resource::DOC:
                $relation = "doc";
            break;
            default:
            abort('403','无效的type类型');
        }
        // 根据添加还是编辑模式，进行对应的操作
        if($resource->id){
            $resource->update($data);
            $resource->{$relation}->update($data);
        }else{
            // 首先进行对数据模型写入，写入成功后调用模型关联写入子表，因为不同表定义了白名单，所以不同表会写入需要的字段
            $resource->create($data)->{$relation}()->create($data);
        }
       });
       alert("操作成功");
       return redirect()->route('admin.resource');
    }

    // 删除
    public function remove(Request $request,Resource $resource){
        // 这里留空判断，如果资源被使用，则不能被删除
        if($resource->chapter()->count()>0){
            alert("当前资源被使用中，请先删除关联的章节",'danger');
            return back();
        }
        // 使用了隐性注入，直接对数据进行操作
        $resource->delete();
        alert("删除资源成功");
        return back();
    }

    // 图片上传
    public function up(Request $request, File $fileModel){
        $result = [
            'success'    => false,
            'msg'        =>'尚未实现上传功能',
            'file_path'  =>''
        ];

        // 检查是否上传了文件
        if(!$request->hasFile('image_file')){
            $result['msg'] = '未选择文件';
            return response()->json($result);
        }

        // 获取文件对象
        $file = $request->file('image_file');

        // 检查文件有效性，安全检查
        if(!$file->isValid()){
            $result['msg'] = $file ->getErrorMessage();
            return response()->json($result);
        }

        // 检查文件类型,这里先$file->extension()获取文件的后缀，然后使用in_array的方法判断后缀是否不被允许
        if(!in_array($file->extension(),config('project.uplode.image'))){
            $result['msg'] = '不被允许的文件类型';
            return response()->json($result);
        }

        $file_path = $file->store('doc','public');

        // 插入数据库,调用模型中的方法，并传入类型、路径、文件对象
        $fileModel->saveFile('doc_editor',$file_path,$file);

        // 编辑器接收到正确信号
        $result['success'] = true;
        $result['file_path'] = asset("storage/".$file_path);

        return $result;
    }
}
